'''

上下文管理器是一种用于管理资源的机制，它确保在使用资源后，无论使用过程中是否出现异常，都能够正确地释放或清理资源。
Python中的上下文管理器主要通过 with 语句来实现，它可以提供更优雅、更安全的资源管理方式。
上下文管理器通常用于打开文件、数据库连接、网络连接、锁等需要手动管理的资源，以确保资源在使用完毕后能够正确地关闭或释放。

__enter__ 和 __exit__ 是上下文管理器协议中的两个特殊方法，用于定义进入和退出上下文时的操作。
当使用 with 语句管理资源时，这些方法会在进入和退出上下文时被自动调用，以确保资源的正确管理和释放。

__enter__ 方法：在进入上下文时被调用，它通常用于执行初始化操作或获取资源。该方法可以返回一个值，
这个值会被绑定到 as 关键字之后的变量，从而可以在 with 块中使用。如果没有返回值，则默认返回上下文管理器自身。


__exit__ 方法:在退出上下文时被调用，它通常用于执行清理操作或释放资源。它接受3个参数：exc_type、exc_value、traceback。
如果上下文是无异常地退出的，三个参数都将为 None。如果出现错误，按顺序返回异常类型、异常描述、异常对象。
在 __exit__ 方法中，您可以选择是否处理异常。如果您希望异常继续传播，只需在方法中不做任何处理即可。
如果您希望处理异常并阻止其传播，可以在方法中返回 True。如果您希望异常继续传播，但也希望在处理完异常后执行一些清理操作，可以返回 False 或 None。
'''


class FileContext:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        print('你好我是 __init__')

    def __enter__(self):
        self.file = open(self.filename, self.mode)
        print('你好我是 __enter__')
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        self.file.close()
        print('你好我是 __exit__')


with FileContext('example.txt', 'r') as file:
    contents = file.read()
    print(contents)
# 文件会在退出上下文时自动关闭
